package com.watson.tool.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * 配置
 */
@Configuration
public class CommonConfiguration {

	private final Logger logger = LoggerFactory.getLogger(getClass());

	/**
	 * 定义一个标准的线程池实例
	 * 调用方式：
	 * <p>
	 *     注入该实例，{@code @Resource private ThreadPoolTaskExecutor standardEppPoolExecutor}
	 *     然后在需要的地方执行standardEppPoolExecutor.execute();即可
	 * </p>
	 * @return
	 */
	@Bean
	public ThreadPoolTaskExecutor standardEppPoolExecutor() {
		logger.info("start standardEppPoolExecutor");
		ThreadPoolTaskExecutor executor = new EppThreadPoolTaskExecutor();
		//配置核心线程数
		executor.setCorePoolSize(16);
		//配置最大线程数
		executor.setMaxPoolSize(100);
		//配置队列大小
		executor.setQueueCapacity(5000);
		//线程池维护线程所允许的空闲时间
		executor.setKeepAliveSeconds(240);
		//配置线程池中的线程的名称前缀
		executor.setThreadNamePrefix("standard-epp-thread-pool-");

		// rejection-policy：当pool已经达到max size的时候，如何处理新任务
		// CALLER_RUNS：不在新线程中执行任务，而是有调用者所在的线程来执行
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		//执行初始化
		executor.initialize();
		return executor;
	}
}
